package com.yangrong.basic;

import java.util.Date;

public class CouldNotReturnChangeableObject {

	private Date hireDay;
	
	/*
	 * 访问器方法
	 * 
	 * 警告：
	 * 注意不要返回引用可变对象的访问器方法。此处违反了这个设计原则，getHireDay方法返回了一个Date类对象。
	 * 
	 * Date类有一个更改器方法setTime，可以在这里设置毫秒数。
	 * Date对象时可变的，这一点破坏了封装性！请看下面的代码：
	 * 
	 * Employee hurry = ...;
	 * Date d = hurry.getHireDay();
	 * double tenYearsInMilliSeconds = 10 * 365.25 * 24 * 60 * 60 * 1000;
	 * d.setTime(d.getTime() - (long)tenYearsInMilliSeconds);
	 * 
	 * 出错的原因很微妙。d和harry.getHireDay()引用同一个对象。对d调用更改器方法就可以自动地改变这个雇员对象的私有状态！
	 */
//	public Date getHireDay() {
//		return hireDay;
//	}
	
	/*
	 * 如果要返回一个可变对象的引用，应该首先对它进行克隆（clone）。对象clone是指存放在另一个位置上的对象副本。
	 * 以下为修改后的代码
	 * 
	 * 如果要返回一个可变数据域的拷贝，就应该使用clone
	 */
	public Date getHireDay() {
		return (Date) hireDay.clone();
	}
	
}
